import 'dart:convert';
import 'dart:math';

import 'package:dio/dio.dart';
import 'package:flutter/foundation.dart';
import 'package:fnos_tv_desktop/core/common/crypto.dart';

/// 生成签名信息
/// @param options - 请求配置对象，包含 method、url、params、data 等属性
/// @param key - 签名密钥，默认为空字符串
/// @returns 生成的签名信息，格式为 "nonce=xxx&timestamp=xxx&sign=xxx"
String generateSignature(RequestOptions options, [String key = '16CCEB3D-AB42-077D-36A1-F355324E4237']) {
  try {
    // 判断请求方法是否为 GET
    bool c = options.method.toUpperCase() == "GET";
    // 解析请求 URL，返回路径和参数对象
    String et = options.uri.path;
    Map<String, dynamic> tt = options.queryParameters;

    // 根据请求方法处理参数或数据
    String rt = c
        ? _stringifyParams({...options.queryParameters, ...tt})
        : options.data != null
        ? jsonEncode(options.data)
        : "";
    // 对处理后的参数或数据进行哈希处理
    String st = _hashSignatureData(rt);
    // 生成 6 位随机数
    String it = _getRandomNumber(100000, 999999).toString().padLeft(6, "0");
    // 获取当前时间戳
    String ot = DateTime.now().millisecondsSinceEpoch.toString();
    // 拼接签名所需的字符串
    String lt = ["NDzZTVxnRKP8Z0jXg1VAMonaG8akvh", et, it, ot, st, key].join("_");
    // 生成包含 nonce、timestamp 和 sign 的对象
    Map<String, String> ct = {'nonce': it, 'timestamp': ot, 'sign': lt.md5()};
    // 将对象转换为 "key=value" 格式并用 & 连接
    return ct.entries.map((entry) => "${entry.key}=${entry.value}").join("&");
  } catch (e) {
    // 捕获异常并打印错误信息，返回空字符串
    if (kDebugMode) print(e);
    return "";
  }
}

// /// 解析 URL，返回路径和参数对象
// List<dynamic> parseUrl(String o) {
//   List<String> parts = o.split("?");
//   String s = parts[0];
//   Map<String, String> c = {};
//   if (parts.length > 1) {
//     String a = parts[1];
//     List<String> params = a.split("&");
//     for (String param in params) {
//       List<String> keyValue = param.split("=");
//       if (keyValue.length == 2 &&
//           keyValue[1] != "undefined" &&
//           keyValue[1] != "null") {
//         c[keyValue[0]] = keyValue[1];
//       }
//     }
//   }
//   return [s, c];
// }

/// 对数据进行哈希签名处理
String _hashSignatureData(String o) {
  try {
    String s = o.replaceAll(RegExp(r'%(?![0-9A-Fa-f]{2})'), '%25');
    String a = Uri.decodeComponent(s);
    return a.md5();
  } catch (s) {
    if (kDebugMode) print(s);
    return o.md5();
  }
}

/// 字符串化参数对象
String _stringifyParams(Map<String, dynamic> o) {
  final queryParameters = <String, String>{};
  o.forEach((key, value) {
    if (value != null) {
      queryParameters[key] = value.toString();
    }
  });
  return Uri(queryParameters: queryParameters).query.replaceAll('+', '%20');
}

/// 生成指定范围内的随机数
int _getRandomNumber(int min, int max) {
  return min + Random().nextInt(max - min);
}
